#ifndef _Soft_i2c_H_
#define _Soft_i2c_H_

#include "main.h"
#include "FreeRTOS.h"
#include "task.h"
#include "uart.h"

#define I2C_WR              0x00       		//写标志
#define I2C_RD              (1 << 0)      	//读标志
#define I2C_ADDR_10BIT      (1 << 1)      	//10位地址模式
#define I2C_NO_START        (1 << 2)      	//无开始条件
#define I2C_IGNORE_NACK     (1 << 3)      	//忽视NACK
#define I2C_NO_READ_ACK     (1 << 4)      	//读的时候不发送ACK
#define I2C_NO_STOP         (1 << 5) 		//传输完不发送停止信号

#define I2C_CONTROL_BYTE    (1 << 6) 		//没发送一数据之前都需要发送一个控制字用来标志之后的数据是命令还是数据
#define I2C_SAME_BYTE       (1 << 7) 		//连续发送msg.tLen个msg.sByte数据字节，发送相同字节会用到避免循环调用传输函数

/*I2c消息定义*/
struct I2C_MessageTypeDef
{
	uint8_t   *buf;    		//传输指定缓冲区数据
	uint16_t  addr;    		//从设备地址
	uint16_t  tLen;		 	//需要传输的数据长度
	uint16_t  rLen; 	 	//返回成功的数据长度
	uint8_t   flags;	 	//标志位 
	uint8_t   cByte;	 	//I2C_CONTROL_BYTE
	uint8_t   sByte;	 	//I2C_SAME_BYTE
};

//I2c总线
struct I2C_BusTypeDef
{
	GPIO_TypeDef *gpiox;
	uint32_t gpio_rcc;
	uint16_t sda_gpio_pin;
	uint16_t scl_gpio_pin;
	
	uint32_t retries; //发地址无响应重试次数（最大不超过255）
	
	void (*udelay)(uint32_t us);//使用了函数指针绑定
	void (*lockInit)(void);
	void (*lock)(void);
	void (*unlock)(void);
};

extern struct I2C_BusTypeDef i2c1;
int I2C_BusInitialize(void);
uint32_t I2C_TransferMessages(struct I2C_BusTypeDef *bus, struct I2C_MessageTypeDef msgs[], uint32_t num);
#endif